Consider a class List. Elements of the list are dynamically appended and removed. The constructor helps us in creating an initial empty list. However, when we
leave the scope of the definition of a list object, we must ensure that the allocated memory is released. We therefore define a special method called destructor which
is called once for each object at its destruction time:
  void zoo() {
    List alist;     // List::List() initializes to
                    // empty list.
    ...             // add/remove elements
  }                 // Destructor call!

Destruction of objects take place when the object leaves its scope of definition or is explicitly destroyed. The latter happens, when we dynamically allocate an object
and release it when it is no longer needed.
Destructors are declared similar to constructors. Thus, they also use the name prefixed by a tilde (~ ) of the defining class:
Destructors take no arguments. It is even invalid to define one, because destructors are implicitly called at destruction time: You have no chance to specify actual
arguments.